草庐IT

Java BufferedImage 内存消耗

全部标签

java - 我可以启动一个 Eden 空间如此之大的 JVM,它运行到完成而没有任何 GC。假设我有一堆空闲内存

如果我有足够的空闲内存,我可以启动一个Java应用程序(说mMven)来单独使用Eden空间运行直到完成而不需要任何GC吗? 最佳答案 是的,我已经为Java6+中的实际应用程序完成了此操作。我从一个24GB的Eden空间、微型幸存者空间和永久空间开始。后来发现8GB绰绰有余。当有bug或错误时它仍然会GC,但在正常操作下不会。我相信选项是-Xmn24g-Xmx26g-XX:SurvivorRatio=100使用默认GC。该应用程序经过优化,生成的数据量低于1GB/小时,因此使用GC运行一天。

java - 从 Java 内存模型的角度理解为什么在构造函数中启动线程是不安全的

这个问题在这里已经有了答案:Whyshouldn'tIuseThread.start()intheconstructorofmyclass?(2个答案)关闭3年前。根据JavaConcurrencyinPractice,在类构造函数中启动线程是危险的。原因是在对象完全构造之前,this将this指针暴露给另一个线程。尽管这个话题在之前的许多StackOverflow问题中都有讨论,但我仍然难以理解为什么这是一个如此令人担忧的问题。特别是,我希望从Java内存模型的角度澄清在构造函数内启动线程是否会导致内存一致性问题。让我举一个具体的例子来说明我想做的事情。(这段代码的期望输出是将数字2

java - BufferedImage.getGraphics() 导致内存泄漏,有解决办法吗?

我在调用BufferedImage.getGraphics()方法的某些框架API时遇到问题,从而导致内存泄漏。这个方法的作用是它总是调用BufferedImage.createGraphics()。在Windows机器上,createGraphics()由Win32GraphicsEnvironment处理,它在其字段displayChanger中保留一个listeners列表。当我在BufferedImagesomeChart上调用getGraphics时,someChart的SurfaceManager(保留对someChart的引用)被添加到监听器在Win32GraphicsE

java - 在 Java 中,有没有办法随机化一个太大而无法放入内存的文件?

我想做的是打乱行(从CSV读取),然后将第一个随机的10,000行打印到一个csv,其余的打印到一个单独的csv。使用较小的文件我可以做类似的事情java.util.Collections.shuffle(...)for(inti=0;i但是对于非常大的文件,我现在得到OutOfMemoryError 最佳答案 你可以:使用更多内存或洗牌不是实际的CSV行,而是行号的集合,然后逐行读取输入文件(当然是缓冲的)并将该行写入所需的输出文件之一。 关于java-在Java中,有没有办法随机化一

java - 在 Java 中处理大字符串时出现 StringBuilder 内存不足错误

我从Stringtest+=str;开始,其中test以指数级增长,包含成千上万个字符。运行需要45分钟,可能是因为创建了大字符串并删除了垃圾。然后我像这样错开输入,将其带到30秒。这似乎是一种廉价的方法,但效果很好:if(secondDump.length()>50){intermedDump=intermedDump+secondDump;secondDump="";}if(intermedDump.length()>100){thirdDump=thirdDump+intermedDump;intermedDump="";}if(thirdDump.length()>500){f

java - 来自文件的 ObjectInputStream 导致内存泄漏

我有一个巨大的文件,其中包含一个接一个由ObjectOutputStream写入的对象列表。for(Objectobj:currentList){oos.writeUnshared(obj);}现在我想使用ObjectInputStream读取这个文件。但是,我需要同时读取多个文件,所以无法将整个文件读入内存。但是,使用ObjectInputStream会导致堆内存不足错误。据我了解,这是因为ObjectInputStream存在内存泄漏并在返回读取对象后仍保留对读取对象的引用。我怎样才能让ObjectInputStream不维护任何读取的引用? 最佳答案

java - 内存泄漏在 MAT 中显示为 GC root : Native Stack

我有一些我运行的第三个库代码,一段时间后我遇到了OutOfMemoryError。所以我启动了EclipseMAT并分析了内存。现在似乎无法释放内存,因为有一个对象显示为GCroot:NativeStack。阅读documentation:Inoroutparametersinnativecode,suchasuserdefinedJNIcodeorJVMinternalcode.ThisisoftenthecaseasmanymethodshavenativepartsandtheobjectshandledasmethodparametersbecomeGCroots.Forexa

java - Java 内存模型中的 Happens-Before 关系

关于JLSch17ThreadsandLocks,它说“如果一个Action发生在另一个Action之前,那么第一个Action对第二个Action可见并在第二个Action之前排序”;我想知道:(1)说“之前订购”究竟是什么意思?因为即使action_ahappens-beforeaction_b,在某些实现中action_a也可以在action_b之后执行,对吗?(2)如果action_a发生在action_b之前,是否意味着action_a不能看到action_b?或者action_a可能看到也可能看不到action_b?(3)如果action_a没有发生在action_b之前,

Java 内存模型 happens-before 线程池交互的保证

Java内存模型是否为线程池交互提供happens-before保证?特别是,在运行工作队列中的项目结束之前,线程池工作线程所做的写入对于之后运行队列中下一个项目的工作线程是否可见?规范(我个人认为这个FAQ很有用:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#synchronization)声明“线程上对start()的调用发生在启动线程中的任何操作之前。”或者简单地说,您在启动线程之前所做的任何内存写入都将在启动的线程将要执行的run()方法之前执行并对其可见。它与线程池不同,start()通常会在您进行

java - 物理内存使用率过高

当我尝试使用storm在本地模式下运行拓扑时出现此错误mvncompileexec:java-Dexec.classpathScope=compile-Dexec.mainClass=my.Topology错误是ERRORbacktype.storm.util-Asyncloopdied!java.lang.OutOfMemoryError:Physicalmemoryusageistoohigh:physicalBytes=3G>maxPhysicalBytes=3G我该如何解决?我不知道我应该增加哪个物理内存!如果我在生产模式下运行拓扑,这个错误会消失吗?UPDATEPhysica